// 定义包名，与Contact和Item类在同一个包中
package flutter.plugins.contactsservice.contactsservice;

// 导入TargetApi注解，指定最低API级别
import android.annotation.TargetApi;
// 导入Android资源类，用于获取本地化字符串
import android.content.res.Resources;
// 导入数据库游标类，用于从联系人数据库中读取数据
import android.database.Cursor;
// 导入Build类，用于检查Android版本
import android.os.Build;

// 静态导入联系人合约中的CommonDataKinds类
import static android.provider.ContactsContract.CommonDataKinds;
// 静态导入结构化地址类，用于处理地址信息
import static android.provider.ContactsContract.CommonDataKinds.StructuredPostal;

// 导入HashMap类，用于数据转换
import java.util.HashMap;

/**
 * 该注解指定此代码适用于Android 2.1 (ECLAIR)及以上版本
 * 确保代码在较旧设备上不会出现兼容性问题
 */
@TargetApi(Build.VERSION_CODES.ECLAIR)

/**
 * 表示联系人的邮政地址信息
 * 包含地址的各个组成部分：街道、城市、邮编等
 */
public class PostalAddress {

    // 地址标签，如"home"、"work"等
    public String label;
    // 街道地址
    public String street;
    // 城市
    public String city;
    // 邮政编码
    public String postcode;
    // 区域/州/省
    public String region;
    // 国家
    public String country;
    // 地址类型，Android系统定义的常量
    int type;

    /**
     * 构造函数
     * @param label 地址标签
     * @param street 街道地址
     * @param city 城市
     * @param postcode 邮政编码
     * @param region 区域/州/省
     * @param country 国家
     * @param type 地址类型代码
     */
    public PostalAddress(String label, String street, String city, String postcode, String region, String country, int type) {
        // 初始化所有字段
        this.label = label;
        this.street = street;
        this.city = city;
        this.postcode = postcode;
        this.region = region;
        this.country = country;
        this.type = type;
    }

    /**
     * 将地址对象转换为HashMap
     * 用于与Flutter端进行数据交换
     * @return 包含地址信息的HashMap
     */
    HashMap<String, String> toMap() {
        // 创建一个新的HashMap对象
        HashMap<String, String> result = new HashMap<>();
        // 将地址的所有字段添加到HashMap中
        result.put("label", label);
        result.put("street", street);
        result.put("city", city);
        result.put("postcode", postcode);
        result.put("region", region);
        result.put("country", country);
        result.put("type", String.valueOf(type)); // 将整数类型转换为字符串
        // 返回创建好的HashMap
        return result;
    }

    /**
     * 从HashMap创建PostalAddress对象
     * 用于从Flutter端接收地址数据
     * @param map 包含地址信息的HashMap
     * @return 创建的PostalAddress对象
     */
    public static PostalAddress fromMap(HashMap<String, String> map) {
        // 从HashMap中获取各个字段的值
        String label = map.get("label");
        String street = map.get("street");
        String city = map.get("city");
        String postcode = map.get("postcode");
        String region = map.get("region");
        String country = map.get("country");
        String typeStr = map.get("type");
        
        // 将type字段从字符串转换为整数
        // 如果type为null，则使用默认值-1表示未知类型
        int type = typeStr != null ? Integer.parseInt(typeStr) : -1;
        
        // 创建并返回新的PostalAddress对象
        return new PostalAddress(label, street, city, postcode, region, country, type);
    }

    /**
     * 获取地址标签文本
     * @param resources Android资源对象，用于获取本地化文本
     * @param type 地址类型常量
     * @param cursor 数据库游标，用于读取自定义标签
     * @param localizedLabels 是否使用本地化标签
     * @return 地址标签的文本表示
     */
    public static String getLabel(Resources resources, int type, Cursor cursor, boolean localizedLabels) {
        // 如果需要使用本地化标签
        if (localizedLabels) {
            // 使用Android系统提供的方法获取本地化的标签文本
            CharSequence localizedLabel = CommonDataKinds.StructuredPostal.getTypeLabel(resources, type, "");
            // 转换为字符串并转为小写返回
            return localizedLabel.toString().toLowerCase();
        } else {
            // 如果不使用本地化标签，直接从游标获取类型并返回英文标签
            switch (cursor.getInt(cursor.getColumnIndex(StructuredPostal.TYPE))) {
                case StructuredPostal.TYPE_HOME: // 家庭地址
                    return "home";
                case StructuredPostal.TYPE_WORK: // 工作地址
                    return "work";
                case StructuredPostal.TYPE_CUSTOM: // 自定义地址类型
                    // 从数据库游标中获取自定义标签
                    final String label = cursor.getString(cursor.getColumnIndex(StructuredPostal.LABEL));
                    return label != null ? label : "";
            }
            // 默认返回"other"
            return "other";
        }
    }
}
